<html><head><meta charset="utf-8"/><title>数组</title></head><body><h1>数组</h1><div class="x-wiki-content x-main-content">
 <p>
  JavaScript的
  <code>
   Array
  </code>
  可以包含任意数据类型，并通过索引来访问每个元素。
 </p>
 <p>
  要取得
  <code>
   Array
  </code>
  的长度，直接访问
  <code>
   length
  </code>
  属性：
 </p>
 <pre><code>var arr = [1, 2, 3.14, 'Hello', null, true];
arr.length; // 6
</code></pre>
 <p>
  <em>
   请注意
  </em>
  ，直接给
  <code>
   Array
  </code>
  的
  <code>
   length
  </code>
  赋一个新的值会导致
  <code>
   Array
  </code>
  大小的变化：
 </p>
 <pre><code>var arr = [1, 2, 3];
arr.length; // 3
arr.length = 6;
arr; // arr变为[1, 2, 3, undefined, undefined, undefined]
arr.length = 2;
arr; // arr变为[1, 2]
</code></pre>
 <p>
  <code>
   Array
  </code>
  可以通过索引把对应的元素修改为新的值，因此，对
  <code>
   Array
  </code>
  的索引进行赋值会直接修改这个
  <code>
   Array
  </code>
  ：
 </p>
 <pre><code>var arr = ['A', 'B', 'C'];
arr[1] = 99;
arr; // arr现在变为['A', 99, 'C']
</code></pre>
 <p>
  <em>
   请注意
  </em>
  ，如果通过索引赋值时，索引超过了范围，同样会引起
  <code>
   Array
  </code>
  大小的变化：
 </p>
 <pre><code>var arr = [1, 2, 3];
arr[5] = 'x';
arr; // arr变为[1, 2, 3, undefined, undefined, 'x']
</code></pre>
 <p>
  大多数其他编程语言不允许直接改变数组的大小，越界访问索引会报错。然而，JavaScript的
  <code>
   Array
  </code>
  却不会有任何错误。在编写代码时，不建议直接修改
  <code>
   Array
  </code>
  的大小，访问索引时要确保索引不会越界。
 </p>
 <h3>
  indexOf
 </h3>
 <p>
  与String类似，
  <code>
   Array
  </code>
  也可以通过
  <code>
   indexOf()
  </code>
  来搜索一个指定的元素的位置：
 </p>
 <pre><code>var arr = [10, 20, '30', 'xyz'];
arr.indexOf(10); // 元素10的索引为0
arr.indexOf(20); // 元素20的索引为1
arr.indexOf(30); // 元素30没有找到，返回-1
arr.indexOf('30'); // 元素'30'的索引为2
</code></pre>
 <p>
  注意了，数字
  <code>
   30
  </code>
  和字符串
  <code>
   '30'
  </code>
  是不同的元素。
 </p>
 <h3>
  slice
 </h3>
 <p>
  <code>
   slice()
  </code>
  就是对应String的
  <code>
   substring()
  </code>
  版本，它截取
  <code>
   Array
  </code>
  的部分元素，然后返回一个新的
  <code>
   Array
  </code>
  ：
 </p>
 <pre><code>var arr = ['A', 'B', 'C', 'D', 'E', 'F', 'G'];
arr.slice(0, 3); // 从索引0开始，到索引3结束，但不包括索引3: ['A', 'B', 'C']
arr.slice(3); // 从索引3开始到结束: ['D', 'E', 'F', 'G']
</code></pre>
 <p>
  注意到
  <code>
   slice()
  </code>
  的起止参数包括开始索引，不包括结束索引。
 </p>
 <p>
  如果不给
  <code>
   slice()
  </code>
  传递任何参数，它就会从头到尾截取所有元素。利用这一点，我们可以很容易地复制一个
  <code>
   Array
  </code>
  ：
 </p>
 <pre><code>var arr = ['A', 'B', 'C', 'D', 'E', 'F', 'G'];
var aCopy = arr.slice();
aCopy; // ['A', 'B', 'C', 'D', 'E', 'F', 'G']
aCopy === arr; // false
</code></pre>
 <h3>
  push和pop
 </h3>
 <p>
  <code>
   push()
  </code>
  向
  <code>
   Array
  </code>
  的末尾添加若干元素，
  <code>
   pop()
  </code>
  则把
  <code>
   Array
  </code>
  的最后一个元素删除掉：
 </p>
 <pre><code>var arr = [1, 2];
arr.push('A', 'B'); // 返回Array新的长度: 4
arr; // [1, 2, 'A', 'B']
arr.pop(); // pop()返回'B'
arr; // [1, 2, 'A']
arr.pop(); arr.pop(); arr.pop(); // 连续pop 3次
arr; // []
arr.pop(); // 空数组继续pop不会报错，而是返回undefined
arr; // []
</code></pre>
 <h3>
  unshift和shift
 </h3>
 <p>
  如果要往
  <code>
   Array
  </code>
  的头部添加若干元素，使用
  <code>
   unshift()
  </code>
  方法，
  <code>
   shift()
  </code>
  方法则把
  <code>
   Array
  </code>
  的第一个元素删掉：
 </p>
 <pre><code>var arr = [1, 2];
arr.unshift('A', 'B'); // 返回Array新的长度: 4
arr; // ['A', 'B', 1, 2]
arr.shift(); // 'A'
arr; // ['B', 1, 2]
arr.shift(); arr.shift(); arr.shift(); // 连续shift 3次
arr; // []
arr.shift(); // 空数组继续shift不会报错，而是返回undefined
arr; // []
</code></pre>
 <h3>
  sort
 </h3>
 <p>
  <code>
   sort()
  </code>
  可以对当前
  <code>
   Array
  </code>
  进行排序，它会直接修改当前
  <code>
   Array
  </code>
  的元素位置，直接调用时，按照默认顺序排序：
 </p>
 <pre><code>var arr = ['B', 'C', 'A'];
arr.sort();
arr; // ['A', 'B', 'C']
</code></pre>
 <p>
  能否按照我们自己指定的顺序排序呢？完全可以，我们将在后面的函数中讲到。
 </p>
 <h3>
  reverse
 </h3>
 <p>
  <code>
   reverse()
  </code>
  把整个
  <code>
   Array
  </code>
  的元素给掉个个，也就是反转：
 </p>
 <pre><code>var arr = ['one', 'two', 'three'];
arr.reverse(); 
arr; // ['three', 'two', 'one']
</code></pre>
 <h3>
  splice
 </h3>
 <p>
  <code>
   splice()
  </code>
  方法是修改
  <code>
   Array
  </code>
  的“万能方法”，它可以从指定的索引开始删除若干元素，然后再从该位置添加若干元素：
 </p>
 <pre><code>var arr = ['Microsoft', 'Apple', 'Yahoo', 'AOL', 'Excite', 'Oracle'];
// 从索引2开始删除3个元素,然后再添加两个元素:
arr.splice(2, 3, 'Google', 'Facebook'); // 返回删除的元素 ['Yahoo', 'AOL', 'Excite']
arr; // ['Microsoft', 'Apple', 'Google', 'Facebook', 'Oracle']
// 只删除,不添加:
arr.splice(2, 2); // ['Google', 'Facebook']
arr; // ['Microsoft', 'Apple', 'Oracle']
// 只添加,不删除:
arr.splice(2, 0, 'Google', 'Facebook'); // 返回[],因为没有删除任何元素
arr; // ['Microsoft', 'Apple', 'Google', 'Facebook', 'Oracle']
</code></pre>
 <h3>
  concat
 </h3>
 <p>
  <code>
   concat()
  </code>
  方法把当前的
  <code>
   Array
  </code>
  和另一个
  <code>
   Array
  </code>
  连接起来，并返回一个新的
  <code>
   Array
  </code>
  ：
 </p>
 <pre><code>var arr = ['A', 'B', 'C'];
var added = arr.concat([1, 2, 3]);
added; // ['A', 'B', 'C', 1, 2, 3]
arr; // ['A', 'B', 'C']
</code></pre>
 <p>
  <em>
   请注意
  </em>
  ，
  <code>
   concat()
  </code>
  方法并没有修改当前
  <code>
   Array
  </code>
  ，而是返回了一个新的
  <code>
   Array
  </code>
  。
 </p>
 <p>
  实际上，
  <code>
   concat()
  </code>
  方法可以接收任意个元素和
  <code>
   Array
  </code>
  ，并且自动把
  <code>
   Array
  </code>
  拆开，然后全部添加到新的
  <code>
   Array
  </code>
  里：
 </p>
 <pre><code>var arr = ['A', 'B', 'C'];
arr.concat(1, 2, [3, 4]); // ['A', 'B', 'C', 1, 2, 3, 4]
</code></pre>
 <h3>
  join
 </h3>
 <p>
  <code>
   join()
  </code>
  方法是一个非常实用的方法，它把当前
  <code>
   Array
  </code>
  的每个元素都用指定的字符串连接起来，然后返回连接后的字符串：
 </p>
 <pre><code>var arr = ['A', 'B', 'C', 1, 2, 3];
arr.join('-'); // 'A-B-C-1-2-3'
</code></pre>
 <p>
  如果
  <code>
   Array
  </code>
  的元素不是字符串，将自动转换为字符串后再连接。
 </p>
 <h3>
  多维数组
 </h3>
 <p>
  如果数组的某个元素又是一个
  <code>
   Array
  </code>
  ，则可以形成多维数组，例如：
 </p>
 <pre><code>var arr = [[1, 2, 3], [400, 500, 600], '-'];
</code></pre>
 <p>
  上述
  <code>
   Array
  </code>
  包含3个元素，其中头两个元素本身也是
  <code>
   Array
  </code>
  。
 </p>
 <p>
  练习：如何通过索引取到
  <code>
   500
  </code>
  这个值：
 </p>
 <pre><code class="language-x-javascript">'use strict';
var arr = [[1, 2, 3], [400, 500, 600], '-'];
----
var x = ??;
----
console.log(x); // x应该为500
</code></pre>
 <h3>
  小结
 </h3>
 <p>
  <code>
   Array
  </code>
  提供了一种顺序存储一组元素的功能，并可以按索引来读写。
 </p>
 <p>
  练习：在新生欢迎会上，你已经拿到了新同学的名单，请排序后显示：
  <code>
   欢迎XXX，XXX，XXX和XXX同学！
  </code>
  ：
 </p>
 <pre><code class="language-x-javascript">'use strict';
var arr = ['小明', '小红', '大军', '阿黄'];
----
console.log('???');
</code></pre>
</div>
</body></html>